#include "fileordermanager.h"
#include <QDebug>
#include <QTextStream>
#include <algorithm>
FileOrderManager::FileOrderManager(QObject* parent)
    : QObject(parent)
{
}
// === 文件顺序管理 ===
void FileOrderManager::addFile(const UnifiedFileInfo& fileInfo, int position)
{
    if (fileInfo.fileIdentity.isEmpty()) {
        return;
    }
    // 如果文件已存在，更新信息而不是添加
    if (m_fileMap.contains(fileInfo.fileIdentity)) {
        updateFileInfo(fileInfo.fileIdentity, fileInfo);
        return;
    }
    int actualPosition = position;
    // 处理位置参数
    if (position < 0 || position >= m_orderedFiles.size()) {
        actualPosition = m_orderedFiles.size();
        m_orderedFiles.append(fileInfo);
    } else {
        m_orderedFiles.insert(position, fileInfo);
    }
    // === Martin Fowler重构：确保displayOrder与位置一致 ===
    // 重新计算所有文件的displayOrder，确保与在列表中的位置一致
    for (int i = 0; i < m_orderedFiles.size(); ++i) {
        m_orderedFiles[i].displayOrder = i;
        // 同时更新映射中的displayOrder
        m_fileMap[m_orderedFiles[i].fileIdentity] = m_orderedFiles[i];
    }
    emit fileAdded(fileInfo.fileIdentity, actualPosition);
    emit fileOrderChanged();
}
void FileOrderManager::removeFile(const QString& fileIdentity)
{
    if (!m_fileMap.contains(fileIdentity)) {
        return;
    }
    // 查找文件在列表中的位置
    int removeIndex = -1;
    for (int i = 0; i < m_orderedFiles.size(); ++i) {
        if (m_orderedFiles[i].fileIdentity == fileIdentity) {
            removeIndex = i;
            break;
        }
    }
    if (removeIndex == -1) {
        return;
    }
    QString fileName = m_orderedFiles[removeIndex].fileName;
    // 从列表和映射中移除
    m_orderedFiles.removeAt(removeIndex);
    m_fileMap.remove(fileIdentity);
    // === Martin Fowler重构：重新计算displayOrder ===
    // 删除文件后，重新计算所有文件的displayOrder，确保与在列表中的位置一致
    for (int i = 0; i < m_orderedFiles.size(); ++i) {
        m_orderedFiles[i].displayOrder = i;
        // 同时更新映射中的displayOrder
        m_fileMap[m_orderedFiles[i].fileIdentity] = m_orderedFiles[i];
    }
    emit fileRemoved(fileIdentity, removeIndex);
    emit fileOrderChanged();
}
void FileOrderManager::moveFile(const QString& fileIdentity, int newPosition)
{
    if (!m_fileMap.contains(fileIdentity)) {
        return;
    }
    // 查找文件当前位置
    int currentIndex = -1;
    for (int i = 0; i < m_orderedFiles.size(); ++i) {
        if (m_orderedFiles[i].fileIdentity == fileIdentity) {
            currentIndex = i;
            break;
        }
    }
    if (currentIndex == -1) {
        return;
    }
    // 检查新位置是否有效
    if (newPosition < 0 || newPosition >= m_orderedFiles.size()) {
        return;
    }
    // 如果位置没有变化，直接返回
    if (currentIndex == newPosition) {
        return;
    }
    // 移动文件
    UnifiedFileInfo fileInfo = m_orderedFiles.takeAt(currentIndex);
    m_orderedFiles.insert(newPosition, fileInfo);
    // === Martin Fowler重构：重新计算displayOrder ===
    // 移动文件后，重新计算所有文件的displayOrder，确保与在列表中的位置一致
    for (int i = 0; i < m_orderedFiles.size(); ++i) {
        m_orderedFiles[i].displayOrder = i;
        // 同时更新映射中的displayOrder
        m_fileMap[m_orderedFiles[i].fileIdentity] = m_orderedFiles[i];
    }
    emit fileOrderChanged();
}
void FileOrderManager::reorderFiles(const QStringList& newOrder)
{
    // 验证新顺序的有效性
    if (newOrder.size() != m_orderedFiles.size()) {
        return;
    }
    // 构建新的有序文件列表
    QList<UnifiedFileInfo> newOrderedFiles;
    QStringList missingFiles;
    for (const QString& fileIdentity : newOrder) {
        if (m_fileMap.contains(fileIdentity)) {
            newOrderedFiles.append(m_fileMap[fileIdentity]);
        } else {
            missingFiles.append(fileIdentity);
        }
    }
    // 检查是否有缺失的文件
    if (!missingFiles.isEmpty()) {
        return;
    }
    // 更新有序列表
    m_orderedFiles = newOrderedFiles;
    // === Martin Fowler重构：重新计算displayOrder ===
    // 重新排序后，重新计算所有文件的displayOrder，确保与在列表中的位置一致
    for (int i = 0; i < m_orderedFiles.size(); ++i) {
        m_orderedFiles[i].displayOrder = i;
        // 同时更新映射中的displayOrder
        m_fileMap[m_orderedFiles[i].fileIdentity] = m_orderedFiles[i];
    }
    for (int i = 0; i < m_orderedFiles.size(); ++i) {
    }
    emit fileOrderChanged();
}
// === 文件信息访问 ===
QList<UnifiedFileInfo> FileOrderManager::getOrderedFiles() const
{
    return m_orderedFiles;
}
int FileOrderManager::getFilePosition(const QString& fileIdentity) const
{
    if (!m_fileMap.contains(fileIdentity)) {
        return -1;
    }
    for (int i = 0; i < m_orderedFiles.size(); ++i) {
        if (m_orderedFiles[i].fileIdentity == fileIdentity) {
            return i;
        }
    }
    return -1;
}
UnifiedFileInfo FileOrderManager::getFileAt(int position) const
{
    if (position < 0 || position >= m_orderedFiles.size()) {
        return UnifiedFileInfo(); // 返回空的UnifiedFileInfo
    }
    return m_orderedFiles[position];
}
bool FileOrderManager::hasFile(const QString& fileIdentity) const
{
    return m_fileMap.contains(fileIdentity);
}
// === 文件元数据更新 ===
void FileOrderManager::updateFileInfo(const QString& fileIdentity, const UnifiedFileInfo& fileInfo)
{
    if (!m_fileMap.contains(fileIdentity)) {
        return;
    }
    // 检查标识是否匹配
    if (fileInfo.fileIdentity != fileIdentity) {
        return;
    }
    // 更新映射中的信息
    m_fileMap[fileIdentity] = fileInfo;
    // 更新有序列表中的信息
    bool foundInOrder = false;
    for (int i = 0; i < m_orderedFiles.size(); ++i) {
        if (m_orderedFiles[i].fileIdentity == fileIdentity) {
            m_orderedFiles[i] = fileInfo;
            foundInOrder = true;
            break;
        }
    }
    if (!foundInOrder) {
    } else {
        emit fileInfoChanged(fileIdentity);
    }
}
UnifiedFileInfo FileOrderManager::getFileInfo(const QString& fileIdentity) const
{
    if (!m_fileMap.contains(fileIdentity)) {
        return UnifiedFileInfo(); // 返回空的UnifiedFileInfo
    }
    return m_fileMap.value(fileIdentity);
}
// === 私有方法 ===
void FileOrderManager::rebuildFileMap()
{
    m_fileMap.clear();
    for (int i = 0; i < m_orderedFiles.size(); ++i) {
        const UnifiedFileInfo& fileInfo = m_orderedFiles[i];
        m_fileMap[fileInfo.fileIdentity] = fileInfo;
    }
}
// === Martin Fowler重构：页码连续性支持 ===
void FileOrderManager::ensureFileInfoAndCalculateStartPage(const QString& fileIdentity, int pageCount)
{
    // 如果文件信息不存在，先添加
    if (!m_fileMap.contains(fileIdentity)) {
        // 创建临时文件信息
        UnifiedFileInfo tempFileInfo;
        tempFileInfo.fileIdentity = fileIdentity;
        tempFileInfo.pageCount = pageCount;
        tempFileInfo.displayOrder = m_orderedFiles.size(); // 添加到末尾
        // 添加到文件列表
        addFile(tempFileInfo);
    } else {
        // 更新现有文件的页数
        UnifiedFileInfo existingFile = m_fileMap[fileIdentity];
        if (existingFile.pageCount != pageCount) {
            existingFile.pageCount = pageCount;
            updateFileInfo(fileIdentity, existingFile);
        }
    }
    // 验证文件顺序的一致性
    auto [isValid, errorMessage] = validateFileOrder();
    if (!isValid) {
    }
}
int FileOrderManager::getFileGlobalStartPageSafe(const QString& fileIdentity) const
{
    if (!m_fileMap.contains(fileIdentity)) {
        return 1; // 安全的默认值
    }
    // 计算文件在列表中的位置
    int position = getFilePosition(fileIdentity);
    if (position < 0) {
        return 1;
    }
    // 计算前面所有文件的页数总和
    int startPage = 1;
    for (int i = 0; i < position; ++i) {
        const UnifiedFileInfo& fileInfo = m_orderedFiles[i];
        startPage += fileInfo.pageCount;
    }
    return startPage;
}
QPair<bool, QString> FileOrderManager::validateFileOrder() const
{
    QStringList errors;
    // 检查有序列表和映射的一致性
    if (m_orderedFiles.size() != m_fileMap.size()) {
        errors.append(QString("有序列表大小(%1)与映射大小(%2)不匹配")
                     .arg(m_orderedFiles.size()).arg(m_fileMap.size()));
    }
    // 检查每个文件是否在两个数据结构中都存在
    for (const UnifiedFileInfo& fileInfo : m_orderedFiles) {
        if (!m_fileMap.contains(fileInfo.fileIdentity)) {
            errors.append(QString("文件 %1 在映射中不存在").arg(fileInfo.fileIdentity));
        }
    }
    for (auto it = m_fileMap.begin(); it != m_fileMap.end(); ++it) {
        bool foundInOrder = false;
        for (const UnifiedFileInfo& fileInfo : m_orderedFiles) {
            if (fileInfo.fileIdentity == it.key()) {
                foundInOrder = true;
                break;
            }
        }
        if (!foundInOrder) {
            errors.append(QString("文件 %1 在有序列表中不存在").arg(it.key()));
        }
    }
    // 检查displayOrder的一致性
    for (int i = 0; i < m_orderedFiles.size(); ++i) {
        if (m_orderedFiles[i].displayOrder != i) {
            errors.append(QString("位置 %1 的displayOrder(%2)不正确")
                         .arg(i).arg(m_orderedFiles[i].displayOrder));
        }
    }
    bool isValid = errors.isEmpty();
    QString errorMessage = errors.isEmpty() ? "验证通过" : errors.join("; ");
    return {isValid, errorMessage};
}
QString FileOrderManager::getDebugInfo() const
{
    QString info;
    QTextStream stream(&info);
    stream << "=== FileOrderManager 调试信息 ===" << Qt::endl;
    stream << "文件总数: " << m_orderedFiles.size() << Qt::endl;
    stream << "映射大小: " << m_fileMap.size() << Qt::endl;
    stream << Qt::endl;
    stream << "文件顺序:" << Qt::endl;
    for (int i = 0; i < m_orderedFiles.size(); ++i) {
        const UnifiedFileInfo& fileInfo = m_orderedFiles[i];
        stream << QString("  [%1] %2 (页数:%3, displayOrder:%4)")
                  .arg(i)
                  .arg(fileInfo.fileName.right(20))
                  .arg(fileInfo.pageCount)
                  .arg(fileInfo.displayOrder)
    }
    // 验证结果
    auto [isValid, errorMessage] = validateFileOrder();
    stream << Qt::endl;
    stream << "验证结果: " << (isValid ? "通过" : "失败") << Qt::endl;
    if (!isValid) {
        stream << "错误信息: " << errorMessage << Qt::endl;
    }
    return info;
}